#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"
// 新增 PWM 头文件 (来自您的 button_music.c)
#include "hi_pwm.h" 

// --- 宏定义 ---
#define LED_INTERVAL_TIME_US 100000 // 缩短检测间隔到 100ms 以获得更灵敏的报警反馈
#define LED_TASK_STACK_SIZE 4096
#define LED_TASK_PRIO 25

// 硬件引脚定义
#define LED_TEST_GPIO 11       // LED (输出)
#define SKEW_DETECT_GPIO 10    // 传感器 (输入)
#define BEEP_PIN 9             // 蜂鸣器 (PWM0)

// 逻辑状态
#define SKEW_DETECT_ON 1
#define SKEW_DETECT_OFF 0

enum LedState {
    LED_ON = 0,
    LED_OFF,
    LED_SPARK,
};

// --- 报警音效频率 (参考您的代码) ---
// 使用高音 Do (约 38223 分频) 作为报警音
static const uint16_t ALARM_FREQ_DIV = 38223; 

// --- 初始化函数 ---
static void SkewDetectInit(void)
{
    // 1. 初始化 LED (GPIO 11)
    IoTGpioInit(LED_TEST_GPIO);
    hi_io_set_func(LED_TEST_GPIO, HI_IO_FUNC_GPIO_11_GPIO); 
    IoTGpioSetDir(LED_TEST_GPIO, IOT_GPIO_DIR_OUT);
    hi_io_set_pull(LED_TEST_GPIO, HI_IO_PULL_UP);
    IoTGpioSetOutputVal(LED_TEST_GPIO, LED_OFF);

    // 2. 初始化 倾斜传感器 (GPIO 10)
    IoTGpioInit(SKEW_DETECT_GPIO);
    hi_io_set_func(SKEW_DETECT_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(SKEW_DETECT_GPIO, IOT_GPIO_DIR_IN);
    hi_io_set_pull(SKEW_DETECT_GPIO, HI_IO_PULL_UP);

    // 3. 初始化 蜂鸣器 (GPIO 9 -> PWM0) [参考 button_music.c]
    hi_io_set_func(BEEP_PIN, HI_IO_FUNC_GPIO_9_PWM0_OUT);
    hi_pwm_init(HI_PWM_PORT_PWM0);
    hi_pwm_set_clock(PWM_CLK_XTAL); // 设置时钟源
}

// --- 开启报警 ---
static void AlarmOn(void)
{
    // 启动 PWM，占空比 50% (div/2)
    hi_pwm_start(HI_PWM_PORT_PWM0, ALARM_FREQ_DIV / 2, ALARM_FREQ_DIV);
}

// --- 关闭报警 ---
static void AlarmOff(void)
{
    hi_pwm_stop(HI_PWM_PORT_PWM0);
}

// --- 任务处理函数 ---
static void *SkewDetectTask(const char *arg)
{
    unsigned char ucType;
    (void)arg;
    
    printf("Skew Detect + Alarm Task Started.\n");

    while (1) {
        ucType = 0;
        // 读取传感器状态
        IoTGpioGetInputVal(SKEW_DETECT_GPIO, &ucType);
        // printf("SKEW_DETECT_GPIO %d\n", ucType); // 调试用，如嫌刷屏可注释掉
        
        if(ucType == SKEW_DETECT_ON)
        {
            // 触发：亮灯 + 鸣叫
            IoTGpioSetOutputVal(LED_TEST_GPIO, LED_ON);
            AlarmOn();
        }
        else
        {
            // 正常：灭灯 + 静音
            IoTGpioSetOutputVal(LED_TEST_GPIO, LED_OFF);
            AlarmOff();
        }
        
        usleep(LED_INTERVAL_TIME_US);
    }
    return NULL;
}

// --- 线程入口函数 ---
static void SkewDetectEntry(void)
{
    osThreadAttr_t attr;
    
    SkewDetectInit();
    
    attr.name = "SkewDetectTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;
    
    if (osThreadNew((osThreadFunc_t)SkewDetectTask, NULL, &attr) == NULL) {
        printf("[SkewDetectEntry] Failed to create SkewDetectTask!\n");
    }
}

SYS_RUN(SkewDetectEntry);
